import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class CaringWindows {
    private static final String[] TIPS = {
            "多喝水哦~", "保持微笑呀", "记得吃水果", "保持好心情", "好好爱自己", "梦想成真",
            "不要熬夜", "爱你哦~", "天天开心", "元气满满", "烦恼都消失", "顺顺利利"
    };

    // 充满活力的背景色：高饱和度、明亮鲜艳，避免浅淡柔和色调
// 柔和活力风背景色：降低饱和度，保留明亮感，更清新不刺眼
    private static final Color[] BG_COLORS = {
            new Color(255, 167, 167),   // 淡活力红（柔和不扎眼）
            new Color(159, 217, 245),   // 淡活力蓝（清爽通透）
            new Color(167, 230, 192),   // 淡活力绿（清新有生机）
            new Color(255, 236, 163),   // 淡活力黄（温暖不刺眼）
            new Color(233, 174, 233),   // 淡活力紫（柔和梦幻）
            new Color(255, 201, 148),   // 淡活力橙（温暖柔和）
            new Color(255, 190, 212)    // 淡活力粉（甜美不浓烈）
    };

    private static final Random RANDOM = new Random();
    private static final int WINDOW_WIDTH = 170;
    private static final int WINDOW_HEIGHT = 70;
    private static final int WINDOW_COUNT = 50;
    private static final int HOLD_SECONDS = 10;
    private static final List<JFrame> frames = new ArrayList<>();

    public static void main(String[] args) {
        // 核心：用EDT线程单步创建窗口，弹一个显一个，不依赖外部线程延迟
        SwingUtilities.invokeLater(() -> {
            Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
            int screenW = (int) screen.getWidth();
            int screenH = (int) screen.getHeight();

            List<Point> heartPoints = generateTinyHeartPoints(screenW, screenH);

            // 逐个创建窗口：每创建一个，立即显示文字，再等200ms创建下一个
            for (Point p : heartPoints) {
                // 直接在EDT线程创建窗口，文字同步渲染（不额外开线程，避免延迟）
                createTextWindow(p.x, p.y);

                // 控制弹出节奏（200ms弹一个，视觉上逐个出现）
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }

            // 自动关闭任务（所有窗口弹完后，延迟指定时间关闭）
            new Thread(() -> {
                try {
                    Thread.sleep(HOLD_SECONDS * 1000);
                    SwingUtilities.invokeLater(() -> frames.forEach(JFrame::dispose));
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }).start();
        });
    }

    /**
     * 弹一个显一个文字：窗口创建后立即渲染文字，无延迟
     */
    private static void createTextWindow(int x, int y) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        frame.setLocation(x, y);
        frame.setAlwaysOnTop(true);
        // 用BorderLayout确保文字垂直居中（适配70高的窗口，避免文字偏上/偏下）
        frame.setLayout(new BorderLayout());
        frame.setResizable(false);

        // 随机选文字和背景色
        String tip = TIPS[RANDOM.nextInt(TIPS.length)];
        Color bgColor = BG_COLORS[RANDOM.nextInt(BG_COLORS.length)];

        // 文字配置：确保创建后立即显示
        JLabel label = new JLabel(tip, SwingConstants.CENTER); // 文字水平+垂直居中
        label.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20)); // 放大字体（20号），更醒目
        label.setBackground(bgColor);
        label.setOpaque(true); // 必须设为true，背景色和文字才会同步显示
        label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // 内边距，避免文字贴边

        // 添加标签到窗口（添加后立即生效，文字同步显示）
        frame.add(label, BorderLayout.CENTER);

        // 加入窗口列表（用于后续关闭）
        frames.add(frame);

        // 窗口显示：调用setVisible(true)后，文字立即渲染
        frame.setVisible(true);
    }

    /**
     * 生成适配窗口的爱心轨迹
     */
    private static List<Point> generateTinyHeartPoints(int screenW, int screenH) {
        List<Point> points = new ArrayList<>();
        // 轨迹系数适配80x70的窗口，保持整体小巧（可根据需求微调）
        double scale = Math.min(screenW, screenH) * 0.03;
        int centerX = screenW / 2;
        int centerY = screenH / 2;

        for (int i = 0; i < WINDOW_COUNT; i++) {
            double angle = 2 * Math.PI * i / WINDOW_COUNT;
            double x = 16 * Math.pow(Math.sin(angle), 3) * scale;
            double y = -(13 * Math.cos(angle) - 5 * Math.cos(2 * angle)
                    - 2 * Math.cos(3 * angle) - Math.cos(4 * angle)) * scale;

            // 计算窗口位置（适配80x70尺寸，避免超出屏幕）
            int screenX = centerX + (int) x - WINDOW_WIDTH / 2;
            int screenY = centerY + (int) y - WINDOW_HEIGHT / 2;

            // 强制限制在屏幕内
            screenX = Math.max(0, Math.min(screenX, screenW - WINDOW_WIDTH));
            screenY = Math.max(0, Math.min(screenY, screenH - WINDOW_HEIGHT));

            points.add(new Point(screenX, screenY));
        }
        return points;
    }

    private static class Point {
        int x, y;
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}